<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Admin extends CI_Controller {

    public $tables = array();
    public $total_tables = array();

    function __construct() {
        parent::__construct();
        $this->load->language('crud_adm_' . $this->config->item('language'), $this->config->item('language'));
        $this->load->config('crud_config', true);
        $this->tables = $this->config->item('tables', 'crud_config');
        $this->config->load('database_tables');
        $this->total_tables = $this->config->item('dbtables');
    }

    public function index() {
        if (!$this->ion_auth->logged_in()) {
            redirect('crud/login');
        } else {
            if ($this->ion_auth->is_admin()) {
                $this->load->view('index');
            } else {
                show_404();
            }
        }
    }

    public function generar($generamos = null) {
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        $this->load->library('grocery_CRUD');
        $this->load->library('GenerarTablas');
        $data['title'] = TITLES . lang('administrar_tablas');
        if (!$this->db->table_exists($this->tables['tablas']) || $generamos == 'S') {
            $this->generartablas->borrar_datos();
            $this->generartablas->generacion_datos();
            $this->session->set_flashdata('mensaje_datos_generados', lang('mensaje_datos_generados'));
            redirect('crud/admin/generar', 'refresh');
        }

        $crud = new grocery_CRUD();

        $crud->set_table($this->tables['tablas']);
        $crud->set_relation_n_n('groups', 'crud_tablas_grupos', 'groups', 'fk_id_crud_tablas', 'fk_id_groups', 'description');
        $crud->set_relation('fk_id_crud_tipos_mantenimientos', $this->tables['tipos_mantenimientos'], 'nombres');
        $crud->set_relation('orden_menu_horizontal', $this->total_tables['menus'], 'desc_menu');
        $crud->set_subject($this->tables['tablas']);
        $crud->columns('nombre', 'orden_menu_horizontal', 'orden_menu_vertical', 'groups', 'url_mantenimiento');
        $crud->fields('nombre', 'orden_menu_horizontal', 'orden_menu_vertical', 'groups', 'url_mantenimiento');
        $crud->change_field_type('orden_menu_vertical', 'integer');
        $crud->callback_column('nombre', array($this, '_nombre_callback'));
        $crud->callback_before_insert(array($this, 'cre_url_mantenimiento_callback'));
        $crud->callback_before_update(array($this, 'upd_url_mantenimiento_callback'));
        $data['output_crud'] = $this->load->view('plantillas/contenedor_crud', $crud->render(), true);
        $this->load->view('admin/generar', $data);
    }
    
    function cre_url_mantenimiento_callback($post_array) {
        $post_array['url_mantenimiento'] = 'crud/mantenimientos/';
        return $post_array;
    }

    function upd_url_mantenimiento_callback($post_array, $primary_key) {
        $post_array['url_mantenimiento'] = 'crud/mantenimientos/'.$post_array['nombre'];
        return $post_array;
    }

    function _nombre_callback($value, $row) {
        return "<a href='" . site_url('crud/admin/tablas/' . $row->id) . "'>" . $value . "</a>";
    }

    public function tablas($tabla_padre = null) {
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        $this->load->library('grocery_CRUD');
        $data['title'] = TITLES . lang('administrar_camposs');
        $crud = new grocery_CRUD();

        $crud->set_table($this->tables['campos']);
        $crud->set_relation('fk_id_' . $this->tables['tablas'], $this->tables['tablas'], 'nombre');
        $crud->set_subject($this->tables['campos']);
        $crud->columns('nombre', 'visible_vista', 'visible_form');
        $crud->fields('nombre', 'visible_vista', 'visible_form');
        $crud->where('fk_id_' . $this->tables['tablas'], $tabla_padre);
        $crud->change_field_type('visible_vista', 'true_false');
        $crud->change_field_type('visible_form', 'true_false');
        $data['output_crud'] = $this->load->view('plantillas/contenedor_crud', $crud->render(), true);
        $this->load->view('admin/campos', $data);
    }

    public function backup() {
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        $this->load->helper('directory');
        $data['title_table'] = 'Backups';
        $data['title'] = TITLES . 'Backups';
        $data['backups'] = directory_map(APPPATH . "modules/crud/backups/", 1);
        $this->load->view('admin/backups', $data);
    }

    public function generar_backup($redireccionar = true) {
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        // Load the DB utility class
        $this->load->dbutil();
        $this->load->library('General');
        $prefs = array(
            'tables' => array(), // Array of tables to backup.
            'ignore' => array(), // List of tables to omit from the backup
            'format' => 'zip', // gzip, zip, txt
            'filename' => $this->general->fec_str_to_ymd(date("d-m-Y")) . "_" . date("His") . '_backup.zip', // File name - NEEDED ONLY WITH ZIP FILES
            'add_drop' => TRUE, // Whether to add DROP TABLE statements to backup file
            'add_insert' => TRUE, // Whether to add INSERT data to backup file
            'newline' => "\n"               // Newline character used in backup file
        );

        // Backup your entire database and assign it to a variable
        $backup = & $this->dbutil->backup($prefs);

        // Load the file helper and write the file to your server
        $this->load->helper('file');
        write_file(APPPATH . "modules/crud/backups/" . $this->general->fec_str_to_ymd(date("d-m-Y")) . "_" . date("His") . '_backup.zip', $backup);
        if($redireccionar){
            redirect('crud/admin/backup', 'refresh');
        }
    }

    public function restaurar($archivo_zip = null) {
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        $this->load->library('Zip_manager');
        foreach (glob(APPPATH . "modules/crud/temp/*.*") as $filename) {
            unlink($filename);
        }
        $zip_manager = new Zip_manager();
        $resultado = $zip_manager->extraer(APPPATH . "modules/crud/backups/" . $archivo_zip, APPPATH . "modules/crud/temp/");
        if (!$resultado) {
            log_message('error', "Error: no se ha podido extraer el archivo " . $archivo_zip);
            $this->session->set_flashdata('message', "Error: no se ha podido extraer el archivo " . $archivo_zip);
            redirect('crud/admin/backup');
        } else {
            //Generamos un backup con lo mas actual para evitar perder cualquier tipo de cambio.
            $this->generar_backup(false);

            log_message('info', "Archivo extraido con exito: " . $archivo_zip);
            $this->load->library('General');
            $this->load->helper('directory');
            $listado = directory_map(APPPATH . "modules/crud/temp/", 1);
            $this->general->instalar_sql(APPPATH . "modules/crud/temp/" . $listado[0], true);
            $this->session->set_flashdata('message', "Archivo " . $archivo_zip . " extraido y restaurado con exito");
            redirect('crud/admin/backup');
        }
    }
    
    public function eliminar_backup($archivo_zip = null){
        unlink(APPPATH . "modules/crud/backups/" . $archivo_zip);
        redirect('crud/admin/backup');
    }
    
    public function tipos_campos_mantenimientos(){
        if (!($this->ion_auth->logged_in() && $this->ion_auth->is_admin())) {
            show_404();
        }
        if($this->input->post('p_tipo_campo') != null){
            redirect('crud/mantenimientos/'.$this->input->post('p_tipo_campo')."_crud");
        }else{
            $this->load->model('admin_model');
            $data['title_table'] = 'Cambiar campos de los mantenimientos';
            $data['title'] = TITLES . 'Cambiar campos de los mantenimientos';
            $this->load->view('admin/tipos_campos', $data);
        }
    }

}

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */